import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Class PlaneWorld inicializa los objetos que va haber en el Mundo 
 * @author Programacion Orientada a Objetos Adrián Cerda Cerda
 * @version Plane Travels    22 de Mayo del 2012
 */
public class PlaneWorld extends World
{

    /**
     * Constructor for objects of class PlaneWorld.
     * 
     */
    private int vidas=15;  // Vidas totales que tiene el Avion
    private int puntos; // variable para que cada ciudad que llege a una ciudad aumente 
    private Contador cont; //Contador para mostrar las vidas que le quedan
    private Contador cont2;//ontador para mostrar a que casa se ha llegado y de cuantas
    private static final GreenfootImage bgImage = new GreenfootImage("mundo1.PNG");// imagen para mi escenario
    public  int scrollSpeed=0;//Variable para saber el valor en que el avion aumenta en X de acuerdo a la velocidad que se mueve
    public  int scrollSpeedY=0;//Variable para saber el valor en que el avion aumenta en Y de acuerdo a la velocidad que se mueve
    private int scrollPositionX=0;//variable para mover las imagenes del mundo en vertical
    private int scrollPositionY=0;//variable para mover las imagenes del mundo en Horisontal
    private Plane plane;//Variable para y crear agregar mi avión 
    private GreenfootImage scrollingImage;//Para la imagen
    private static final int JUGAR=1;// consatante para empezar el juego
    private static final int CREDITOS=2;// consatante para ver los creditos
    private static final int AYUDA=3;//Constante para la  Ayuda
    private static final int MENU=0;//Sila opsión esta en 0 iremos al Menu
    private Menu jugar;//para crear un objeto para empezar a jugar
    private Menu ayuda;//Para crear el Boton ayuda
    private Menu creditos;// para crear el Boton creditos
    private Menu menu;//Para crear el boton Menu
    Menu titulo; //Para crear la imagen Principal 
    private  GreenfootImage fondo;//Para poner la Imagen principal(en el Menu)
    private int nivel=4;//Para poder cambiar de nivel
    private Cronometro crono;//Para crear un Objeto para mostrar el tiempo
    public int numCiudades;//Para almacenar las ciudades que se deben de recorrer en cada nivel
    private int opsion=0;// para la opsion del menu
    
    /**
     * Permite que las imagen del mundo se mueva
     */
    public void act()
    {
      if(nivel>=1)
       {
           scrollSpeedY=velocidadY();
           scrollSpeed=velocidad();

          if(scrollSpeed > 0 && scrollPositionX <= 0)
            {
            scrollPositionX = getWidth();
            }
          else
          if(scrollSpeed < 0 && scrollPositionX >= getWidth()) 
           {
             scrollPositionX = 0;
           }
          else 
            scrollPositionX -= scrollSpeed;
        
          if(scrollSpeedY >= 0 && scrollPositionY < 0)
            {
             scrollPositionY = getHeight();
            }
          else if(scrollSpeedY <= 0 && scrollPositionY > getHeight()) 
            {
             scrollPositionY = 0;
            }
          else
          scrollPositionY -= scrollSpeedY;
        
        paint(scrollPositionX,scrollPositionY);
      }
    }
    /**
     * Verifica la velocidad en que se debe mover el Mundo Horizontalmente
     * @retur la velocidad en que va el avion en X
     */
    public int velocidad()
    {
        return plane.dameVelocidad();
    }
     /**
     * Verifica la velocidad en que se debe mover el Mundo Verticalmente
     * @retur la velocidad en que va el avion en Y
     */
    public int velocidadY()
    {
        return plane.dameVelocidadY();
    }
    /**
     * Paint scrolling image at given position and make sure the rest of
     * the background is also painted with the same image.
     */
    private void paint(int positionX, int positionY)
    {
        GreenfootImage bg = getBackground();
        
        bg.drawImage(scrollingImage, positionX - scrollingImage.getWidth(), positionY-scrollingImage.getHeight());//1
        
        bg.drawImage(scrollingImage, positionX - scrollingImage.getWidth(), positionY);//2
        
        bg.drawImage(scrollingImage, positionX, positionY - scrollingImage.getHeight());//3
        
        bg.drawImage(scrollingImage, positionX, positionY);//4
    }
 
    /**
     * Returns an image with the given dimensions.
     */
    private GreenfootImage getScrollingImage(int width, int height)
    {
        GreenfootImage image = new GreenfootImage(width, height);
        for(int x = 0; x < width; x += bgImage.getWidth()) {
            for(int y = 0; y < height; y += bgImage.getHeight()) {
                image.drawImage(bgImage, x, y);
            }
        }
        return image;
    } 
    /**
     * Constructor de PlaneWorld
     */

    public PlaneWorld()
    {    
         super(760, 460, 1);
         jugar= new Menu(1);
         creditos= new Menu(2);
         ayuda= new Menu(3);
         menu= new Menu(0);
         titulo= new Menu(5);
         fondo= new GreenfootImage("TITULO.PNG");
         this.menuOpsion(0,0);
     
    }
    /**
     * Metodo para mostra la ayuda
     */
    public void ayuda()
    {
        GreenfootImage ima= new GreenfootImage("txtAyuda1.PNG");
        this.setBackground(ima);
        addObject(menu,680,30); 
    }
    /**
    *Disminuye la vida del Jugador si llega a tener cero vidas se regresa al Menu
     */
    public void disminuyeVida()
    {
        vidas--;
        cont.actualizaValor(vidas);
        if(vidas==0)
        {
            Mensaje msj= new Mensaje("**PERDISTE**  TU AVION HA SIDO DESTRUIDO",40);
            msj.imprime();
            addObject(msj, 385, 230);
            Greenfoot.delay(200);
            vidas=15;
            menuOpsion(0,0);
            
            
        }
    }
    /** 
     * Si se termina el tiempo Pierde y regresa al Menu
     */ 
    public void detener()
    {
        Mensaje msj= new Mensaje("**PERDISTE** SE TERMINO EL TIEMPO ",30);
        msj.imprime();
        addObject(msj, 385, 230);
        Greenfoot.delay(200);
        menuOpsion(0,0);
        vidas=15;
        crono.modifCont();
    }
    /**
     * Aumenta los puntos cada que se llega a una casa... 
     * si los puntos son igual a la numero de casas que debe de recorrer 
     * se pasa al siguiente nivel.
     * si pasa los cuatro niveles muestra un mensaje de que ha ganado
     */
    public void aumentaPuntos()
    {
        int aux=1;
        puntos++;
        cont2.actualizaValor(puntos);
        if(puntos==numCiudades)
        {
           nivel=nivel+1;
           if(nivel <=4)
            {
               Mensaje msj= new Mensaje("PASASTE AL NIVEL "+ String.valueOf(nivel)+" ",40 );
               msj.imprime();
               addObject(msj, 385, 230);
               Greenfoot.delay(200);
               opsion=1;
            }
            else
            {
                Mensaje msj= new Mensaje("FELICIDADES GANASTE",30);
                msj.imprime();
                addObject(msj, 385, 230);
                Greenfoot.delay(200);
                nivel=0;
                opsion=0;
                Greenfoot.stop();
            }
            menuOpsion(opsion,nivel); 
             
        }
    }
    /**
     * Metodo para el Menu...
     * @param op Para la opsion que se escogio y así realizarla
     * @param n Para poder cambiar de nivel
     */
    public void menuOpsion(int op,int  n)
    {
        nivel=n;
        switch(op)
        {
           case JUGAR:
                   this.eliminaObjetos();
                   if(nivel==1)
                       this.prepare();
                   else if(nivel==2)
                       this.prepare2();
                   else if(nivel==3)
                       this.prepare3();
                    else if(nivel==4)
                       this.prepare4();
                   else
                   menuOpsion(0,0);
                break;
           case AYUDA:
                   this.eliminaObjetos();
                   ayuda();
                  break;
           case CREDITOS:
                    this.eliminaObjetos();
                    creditos();
                   break;
           case MENU:
                    nivel=0;
                    this.eliminaObjetos();
                    menu();
                  break;
                    
        }
    }
    /**
     * Metodo que muestra el Menu
     */
    public void menu()
    {
        this.setBackground(fondo);
        addObject(jugar,130,80);
        addObject(creditos,420,410);
        addObject(ayuda,620,410);

    }
    /**
     * Metodo que muestra los Creditos
     */
    public void creditos()
    {
        GreenfootImage c= new GreenfootImage("CREDITOS.PNG");
        this.setBackground(c);
        addObject(menu,680,30);
    }  
    /**
     * Metodo para eliminar los todos los objetos 
     */

    public void eliminaObjetos()
    {
        int num,i=0;
        num=getObjects(null).size();
        Actor eli;
        while(i<num)
        {
            eli= (Actor) getObjects(null).get(0);
            removeObject(eli);
            i++;
        }
    }
    /**
     * Inicializa el mundo.. poniendo una Imagen y agregando algunos objetos como el 
     * Plane, Contadores, Cronometro etc.
     */
    public void iniciaMundo()
    {
        
        GreenfootImage background = new GreenfootImage(760, 460);
        scrollingImage = getScrollingImage(760, 460);
        background.drawImage(scrollingImage, 0, 0);
        setBackground(background);
        
        String niv= String.valueOf(nivel);
        Mensaje msj= new Mensaje("NIVEL  "+niv+"",25);
        msj.imprime();
        addObject(msj, 350, 15);
        cont = new Contador("VIDAS","15");
        addObject(cont,600,333);
        cont.setLocation(500,24);
        String num=String.valueOf(numCiudades);
        puntos=0;
        cont2= new Contador("CIUDAD",num);
        addObject(cont2,200,333);
        cont2.setLocation(100,24);
        plane = new Plane();
        addObject(plane, 385, 230);
        crono= new Cronometro();
        addObject(crono,650,24);
        crono.inicializarCrono();
        crono.actualizarCrono();
     }
    /**
     * Metodo para el nivel 1 
     * inicializa el mundo y agrega Enemigos(Helicopteros)
     * Se deben de recorrer por 5 ciudades para pasar al nivel 2
     */
    private void prepare()
      {
        numCiudades=5;
        iniciaMundo();
        Ciudad c= new Ciudad(0);
        addObject(c, 511, 333);
        
        Nube1 nub1= new Nube1(1);
        addObject(nub1, 45, 56);
        Nube1 nub2= new Nube1(2);
        addObject(nub2, 455, 156);
        
        Nube2 nub21= new Nube2(1);
        addObject(nub21, 5, 5);
        Nube2 nub22= new Nube2(2);
        addObject(nub22, 455, 356);
        Nube2 nub23= new Nube2(3);
        addObject(nub23, 245, 656);
        Nube2 nub24= new Nube2(4);
        addObject(nub24, 415, 15);
        
      
        
        Helicoptero Helicoptero = new Helicoptero(220, 1);
        addObject(Helicoptero, 386, 102);
        Helicoptero helicoptero2 = new Helicoptero(160, 1);
        addObject(helicoptero2, 113, 114);
        Helicoptero helicoptero3 = new Helicoptero(200,1);
        addObject(helicoptero3, 173, 318);
        Helicoptero helicoptero4 = new Helicoptero(180,1);
        addObject(helicoptero4, 256, 290);

       }
     /**
     * Metodo para el nivel 2 
     * inicializa el mundo y agrega más Enemigos (Helicopteros) 
     * Se deben de recorrer 8 ciudades para pasar al nivel 2
     */
     public void prepare2()
     {
        
        numCiudades=8;
        iniciaMundo();
        Nube1 nub3= new Nube1(3);
        addObject(nub3, 145, 556);
        Nube1 nub4= new Nube1(4);
        addObject(nub4, 645, 456);
        
        Nube2 nub21= new Nube2(1);
        addObject(nub21, 5, 5);
        Nube2 nub22= new Nube2(2);
        addObject(nub22, 255, 356);
        Nube2 nub23= new Nube2(3);
        addObject(nub23, 235, 696);
        Nube2 nub24= new Nube2(5);
        addObject(nub24, 415, 152);
        
        Helicoptero Helicoptero = new Helicoptero(220,2);
        addObject(Helicoptero, 600, 102);
        Helicoptero helicoptero2 = new Helicoptero(160,1);
        addObject(helicoptero2, 15, 200);
        Helicoptero helicoptero3 = new Helicoptero(200,2);
        addObject(helicoptero3, 573, 118);
        Helicoptero helicoptero4 = new Helicoptero(180,1);
        addObject(helicoptero4, 666, 430);
        Helicoptero helicoptero5 = new Helicoptero(180,2);
        addObject(helicoptero5, 300, 400);    
         Helicoptero helicoptero6 = new Helicoptero(180,2);
        addObject(helicoptero6, 100, 300);    
      
    }
     /**
     *Metodo para el nivel 3 
     * inicializa el mundo y agrega más Enemigos (Helicopteros) 
     * Se deben de recorrer por 10 ciudades para pasar al nivel 3
     */
     public void prepare3()
     {
        numCiudades=10;
        iniciaMundo();
        Nube1 nub1= new Nube1(1);
        addObject(nub1, 45, 56);
        Nube1 nub2= new Nube1(3);
        addObject(nub2, 455, 156);
       
        Nube1 nub3= new Nube1(3);
        addObject(nub3, 645, 556);
        Nube1 nub4= new Nube1(4);
        addObject(nub4, 45, 256);
        
        Nube2 nub21= new Nube2(4);
        addObject(nub21, 5, 5);
        Nube2 nub22= new Nube2(2);
        addObject(nub22, 455, 356);
        Nube2 nub23= new Nube2(1);
        addObject(nub23, 245, 656);
        Nube2 nub24= new Nube2(3);
        addObject(nub24, 415, 15);
        Nube2 nub25= new Nube2(5);
        addObject(nub25, 215, 215);
        
        Helicoptero Helicoptero = new Helicoptero(224,2);
        addObject(Helicoptero, 500, 300);
        Helicoptero helicoptero2 = new Helicoptero(160,2);
        addObject(helicoptero2, 15, 114);
        Helicoptero helicoptero3 = new Helicoptero(160,3);
        addObject(helicoptero3, 24, 100);
        Helicoptero helicoptero4 = new Helicoptero(160,2);
        addObject(helicoptero4, 300, 400);
        Helicoptero helicoptero5 = new Helicoptero(160,3);
        addObject(helicoptero5, 600, 400);
        Helicoptero helicoptero6 = new Helicoptero(160,3);
        addObject(helicoptero6, 400, 100);
        Helicoptero helicoptero7 = new Helicoptero(160,1);
        addObject(helicoptero7, 100, 400);  
    }
     public void prepare4()
     {
        numCiudades=10;
        iniciaMundo();
      
        Nube1 nub1= new Nube1(2);
        addObject(nub1, 145, 56);
        Nube1 nub2= new Nube1(3);
        addObject(nub2, 255, 156);
        
        Nube2 nub21= new Nube2(4);
        addObject(nub21, 5, 5);
        Nube2 nub22= new Nube2(2);
        addObject(nub22, 455, 56);
        Nube2 nub23= new Nube2(1);
        addObject(nub23, 245, 556);
        Nube2 nub24= new Nube2(3);
        addObject(nub24, 415, 215);
        Nube2 nub25= new Nube2(5);
        addObject(nub25, 215, 395);
        
        Helicoptero helicoptero2 = new Helicoptero(160,2);
        addObject(helicoptero2, 15, 114);
        Helicoptero helicoptero3 = new Helicoptero(160,3);
        addObject(helicoptero3, 24, 100);
        Helicoptero helicoptero4 = new Helicoptero(160,2);
        addObject(helicoptero4, 300, 400);
        Helicoptero helicoptero5 = new Helicoptero(160,3);
        addObject(helicoptero5, 600, 400);
        Helicoptero helicoptero6 = new Helicoptero(160,3);
        addObject(helicoptero6, 400, 100);
        Helicoptero helicoptero7 = new Helicoptero(160,1);
        addObject(helicoptero7, 100, 400);  
        Helicoptero helicoptero8 = new Helicoptero(160,1);
        addObject(helicoptero8, 350, 400);  
       
    }
}
